using System;
using System.Windows.Forms;
using App.Controlador;
using App.Modelo;
using App.Modelo.Attributes;
using App.Modelo.Interfaces;
using App.Modelo.Menu;
using App.Seguridad.Vista.Menu;

namespace App.Seguridad.Vista.Forms
{
    [Formulario("Usuarios")]
    public partial class ListadoUsuarios : Form, INombreFormularioSeguridad
    {
        private readonly MenuBoton cmdSeleccionar;
        private ControladoraUsuarios _controladoraUsuarios;

        public ControladoraUsuarios ControladoraUsuarios
        {
            get
            {
                return _controladoraUsuarios ??
                       (_controladoraUsuarios =
                        ModuloSeguridad.Instance.FabricaControladoras.Factory<ControladoraUsuarios>());
            }
            set { _controladoraUsuarios = value; }
        }


        private Usuario usuarioSeleccionado;

        public ListadoUsuarios()
        {
            InitializeComponent();

            var menuControlador = new MenuControladoraBotonera
            {
                Controls = flowLayoutPanel1.Controls,
                Model = new MenuContenedor(new MenuBaseItem[]
                                                            {
                                                                new MenuBoton("Nuevo",
                                                                            "user_add",
                                                                            "Usuarios/alta"),
                                                                new MenuBoton("Ver",
                                                                            "application_form_magnify",
                                                                            "Usuarios/ver"),
                                                                new MenuBoton("Modificar",
                                                                            "user_edit",
                                                                            "Usuarios/modificar"),
                                                                new MenuBoton("Eliminar",
                                                                            "vcard_delete",
                                                                            "Usuarios/baja"),
                                                                new MenuBoton("Establecer Clave",
                                                                            "key_go",
                                                                            "ClaveAcceso/alta")
                                                            })
            };


            menuControlador.ExecuteCommand += menuControlador_ExecuteCommand;
            //cmdSeleccionar = new MenuBoton("Seleccionar", "accept", "seleccionar");

           // cmdSeleccionar.Control.Visible = false;
        }

        #region INombreFormularioSeguridad Members

        public string NombreFormularioSeguridad
        {
            get { return "Usuarios"; }
        }

        #endregion

        [Comando("alta")]
        public void AltaUsuario()
        {
            var detalleUsuarioForm = new DetalleUsuario
                                         {
                                             Usuario = new Usuario(),
                                             ControladoraUsuarios = ControladoraUsuarios,
                                             Text = "Nuevo usuario",
                                             MdiParent = MdiParent,
                                             Modo = ModoFormularioABM.Alta
                                         };
            detalleUsuarioForm.Closed += detalleUsuarioForm_Closed;
            ModuloSeguridad.Instance.AbrirFormulario(detalleUsuarioForm);
        }

        private void detalleUsuarioForm_Closed(object sender, EventArgs e)
        {
            var form = (Form) sender;
            if (form.DialogResult == DialogResult.OK)
                _actualizarGrilla(ControladoraUsuarios.List());

            ModuloSeguridad.Instance.AbrirFormulario(this);
        }

        void _actualizarGrilla(object lista)
        {
            dgUsuarios.DataSource = ControladoraUsuarios.List();
        }

        [Comando("ver")]
        public void Ver()
        {
            ModuloSeguridad.Instance.AbrirFormulario(this);
        }


        [Comando("modificar")]
        public void Modificar()
        {
            ModuloSeguridad.Instance.AbrirFormulario(this);
        }

        [Comando("baja")]
        public void baja()
        {
            ModuloSeguridad.Instance.AbrirFormulario(this);
        }

        private void ListadoUsuario_Load(object sender, EventArgs e)
        {
            dgUsuarios.DataSource = ControladoraUsuarios.List();
        }

        private void menuControlador_ExecuteCommand(object sender, MenuEjecutarComandoEventArgs e)
        {
            switch (e.Item.Command)
            {
                case "Usuarios/alta":
                    AltaUsuario();
                    break;
                case "Usuarios/baja":
                    bajaUsuario();
                    break;
                case "Usuarios/modificar":
                    modificarUsuario();
                    break;
                case "Usuarios/ver":
                    verUsuario();
                    break;
                case "ClaveAcceso/alta":
                    _establecerClave();
                    break;
                case "seleccionar":
                    _seleccionarUsuario();
                    break;
                case "cancelar":
                    usuarioSeleccionado = null;
                    DialogResult = DialogResult.Cancel;
                    Close();
                    break;
            }
        }

        void _establecerClave()
        {
            if (dgUsuarios.SelectedRows.Count == 1)
            {
                var usuario = (Usuario) dgUsuarios.SelectedRows[0].DataBoundItem;

                var f = new CambioClave
                            {
                                ControladoraUsuarios = ControladoraUsuarios,
                                Usuario = usuario
                            };
                f.Alta();
            }
            else
            {
                MessageBox.Show(
                    "Debe seleccionar al menos un registro",
                    Text,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation
                    );
            }
        }

        private void verUsuario()
        {
            if (dgUsuarios.SelectedRows.Count == 1)
            {
                var usuario = (Usuario) dgUsuarios.SelectedRows[0].DataBoundItem;

                var detalleUsuarioForm = new DetalleUsuario
                                             {
                                                 Usuario = usuario,
                                                 MdiParent = MdiParent,
                                                 ControladoraUsuarios = ControladoraUsuarios,
                                                 Text = "Detalle usuario " + usuario.NombreVisible,
                                                 Modo = ModoFormularioABM.Ver
                                             };
                detalleUsuarioForm.Closed += detalleUsuarioForm_Closed;
                ModuloSeguridad.Instance.AbrirFormulario(detalleUsuarioForm);
            }
            else
            {
                MessageBox.Show(
                    "Debe seleccionar al menos un registro",
                    Text,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation
                    );
            }
        }

        private void toolStripButton4_Click(object sender, EventArgs e)
        {
            dgUsuarios.DataSource = ControladoraUsuarios.List(txtBuscar.Text);
        }


        private void txtBuscar_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                toolStripButton4_Click(sender, e);
            }
        }


        private void modificarUsuario()
        {
            if (dgUsuarios.SelectedRows.Count == 1)
            {
                var usuario = (Usuario) dgUsuarios.SelectedRows[0].DataBoundItem;

                var detalleUsuarioForm = new DetalleUsuario
                                             {
                                                 Usuario = usuario,
                                                 MdiParent = MdiParent,
                                                 ControladoraUsuarios = ControladoraUsuarios,
                                                 Text = "Modificar usuario " + usuario.NombreVisible,
                                                 Modo = ModoFormularioABM.Modificacion
                                             };
                detalleUsuarioForm.Closed += detalleUsuarioForm_Closed;
                ModuloSeguridad.Instance.AbrirFormulario(detalleUsuarioForm);
            }
            else
            {
                MessageBox.Show(
                    "Debe seleccionar al menos un registro",
                    Text,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation
                    );
            }
        }

        private void bajaUsuario()
        {
            if (dgUsuarios.SelectedRows.Count == 1)
            {
                var usuario = (Usuario) dgUsuarios.SelectedRows[0].DataBoundItem;

                if (MessageBox.Show(
                    "Esta seguro que desea eliminar el usuario " + usuario,
                    Text,
                    MessageBoxButtons.YesNo,
                    MessageBoxIcon.Question
                        ) == DialogResult.Yes)
                {
                    ControladoraUsuarios.Delete(usuario);
                    dgUsuarios.DataSource = ControladoraUsuarios.List();
                }
            }
            else
            {
                MessageBox.Show(
                    "Debe seleccionar al menos un registro",
                    Text,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation
                    );
            }
        }


        public Usuario SeleccionarUsuario()
        {
//            cmdAlta.Visible = cmdBaja.Visible
            //              = cmdModificar.Visible = false;

            //        cmdSeleccionar.Visible = cmdCancelar.Visible = true;

            cmdSeleccionar.Control.Visible = true;

            ControlBox = false;

            ShowDialog();

            return usuarioSeleccionado;
        }

        private void _seleccionarUsuario()
        {
            if (dgUsuarios.SelectedRows.Count == 1)
            {
                usuarioSeleccionado = (Usuario) dgUsuarios.SelectedRows[0].DataBoundItem;
                DialogResult = DialogResult.OK;
                Close();
            }
            else
            {
                MessageBox.Show(
                    "Debe seleccionar al menos un registro",
                    Text,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Exclamation
                    );
            }
        }

        private void dgUsuarios_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
        }
    }
}